package c_000_com

import (
	"fmt"
	"strings"
)

type User struct {
	Id   int
	Name string
}

// 普通函数
func GetUserName(user User) string {
	return user.Name
}

// User的方法
func (user User) GetUserName() string {
	return user.Name
}

// 直接修改user，不会影响主方法中的user
func (user User) SetUserName1(newName string) {
	user.Name = newName
	fmt.Println("函数中的user内存地址1", GetStructAddress(&user), user)
}

// 修改指针，会影响主方法中的user
func (user *User) SetUserName2(newName string) {
	user.Name = newName
	fmt.Println("函数中的user内存地址2", GetStructAddress(user), *user)
}

// 定义第二个类型
type Users []User

// Users的方法:获得所有的name
// PS:同一个package下，方法名称可以重复，但是返回类型，绑定的type至少一样不同
func (us Users) GetUserName() string {
	sb := strings.Builder{}
	for _, u := range us {
		sb.WriteString(u.GetUserName())
		sb.WriteString(",")
	}
	return sb.String()
}
